package com.kefu.notice.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.kefu.common.context.KefuContext;
import com.kefu.common.service.AbstractKefuService;
import com.kefu.common.util.Assert;
import com.kefu.notice.mapper.BossNoticeInfoMapper;
import com.kefu.notice.model.BossNoticeInfo;
import com.kefu.notice.service.BossNoticeInfoService;
import com.kefu.notice.vo.BossNoticeInfoUpdateVo;

@Service
@Transactional
public class BossNoticeInfoService extends AbstractKefuService<BossNoticeInfo> {
    @Autowired
    protected BossNoticeInfoMapper bossNoticeInfoMapper;

	public BossNoticeInfo updateNotice(BossNoticeInfoUpdateVo updateVo) {
		BossNoticeInfo info = updateVo.convert();
    	BossNoticeInfo old=bossNoticeInfoMapper.selectById(info.getNoticeId());
    	Assert.isNull(old, "公告不存在");
    	Assert.isTrue(old.getPublishStatus()==1, "公告已发布");
    	bossNoticeInfoMapper.updateById(info);
    	return info;
	}
	public BossNoticeInfo publish(String id) {
		BossNoticeInfo info=bossNoticeInfoMapper.selectById(id);
		Assert.isNull(info, "公告不存在");
		Assert.isTrue(info.getPublishStatus()==1, "公告已发布");
		Assert.isTrue(info.getDataStatus()==0, "公告已失效");
		
		UpdateWrapper<BossNoticeInfo> update=Wrappers.update();
		update.setSql("sort_num=sort_num+1");
		update.eq("publish_status", 1);
		bossNoticeInfoMapper.update(null, update);
		info.setPublishStatus(1);
		KefuContext context=KefuContext.getKefuContext();
		info.setUpdateId(context.getUserId());
		info.setUpdateTime(context.getNow());
		info.setSortNum(1);
		bossNoticeInfoMapper.updateById(info);
		return info;
	}

	public BossNoticeInfo revoke(String id) {
		BossNoticeInfo info=bossNoticeInfoMapper.selectById(id);
		Assert.isNull(info, "公告不存在");
		Assert.isTrue(info.getPublishStatus()==0, "公告已撤销");
		UpdateWrapper<BossNoticeInfo> update=Wrappers.update();
		update.setSql("sort_num=sort_num-1");
		update.eq("publish_status", 1);
		update.gt("sort_num", info.getSortNum());
		bossNoticeInfoMapper.update(null, update);
		
		info.setPublishStatus(0);
		KefuContext context=KefuContext.getKefuContext();
		info.setUpdateId(context.getUserId());
		info.setUpdateTime(context.getNow());
		info.setSortNum(0);
		bossNoticeInfoMapper.updateById(info);
		return info;
	}

	public BossNoticeInfo enable(String id) {
		BossNoticeInfo info=bossNoticeInfoMapper.selectById(id);
		Assert.isNull(info, "公告不存在");
		info.setDataStatus(1);
		KefuContext context=KefuContext.getKefuContext();
		info.setUpdateId(context.getUserId());
		info.setUpdateTime(context.getNow());
		bossNoticeInfoMapper.updateById(info);
		return info;
	}

	public BossNoticeInfo disabled(String id) {
		BossNoticeInfo info=bossNoticeInfoMapper.selectById(id);
		Assert.isNull(info, "公告不存在");
		Assert.isTrue(info.getPublishStatus()==1, "公告已发布");
		info.setDataStatus(0);
		KefuContext context=KefuContext.getKefuContext();
		info.setUpdateId(context.getUserId());
		info.setUpdateTime(context.getNow());
		bossNoticeInfoMapper.updateById(info);
		return info;
	}

	public void down(String id) {
		BossNoticeInfo info=bossNoticeInfoMapper.selectById(id);
		Assert.isNull(info, "公告不存在");
		Assert.isTrue(info.getPublishStatus()==0, "公告已撤销");
		BossNoticeInfo next=new BossNoticeInfo();
		next.setPublishStatus(1);
		next.setSortNum(info.getSortNum()+1);
		BossNoticeInfo nextInfo=bossNoticeInfoMapper.selectOne(next);
		Assert.isNull(nextInfo, "已经是最后一个");
		info.setSortNum(info.getSortNum()+1);
		nextInfo.setSortNum(nextInfo.getSortNum()-1);
		bossNoticeInfoMapper.updateById(info);
		bossNoticeInfoMapper.updateById(nextInfo);
		
	}
	public void up(String id) {
		BossNoticeInfo info=bossNoticeInfoMapper.selectById(id);
		Assert.isNull(info, "公告不存在");
		Assert.isTrue(info.getPublishStatus()==0, "公告已撤销");
		Assert.isTrue(info.getSortNum()==1, "已经是第一个");
		
		BossNoticeInfo previous=new BossNoticeInfo();
		previous.setPublishStatus(1);
		previous.setSortNum(info.getSortNum()-1);
		BossNoticeInfo previousInfo=bossNoticeInfoMapper.selectOne(previous);
		info.setSortNum(info.getSortNum()-1);
		previousInfo.setSortNum(previousInfo.getSortNum()+1);
		bossNoticeInfoMapper.updateById(info);
		bossNoticeInfoMapper.updateById(previousInfo);
	}

}